#ifndef __m_modbus_H__
#define __m_modbus_H__

#include "m_modbus_comm.h"

/**
 * @brief 初始化Modbus即插即用框架
 * @return 成功返回0，失败返回-1
 */
int m_modbus_init(void);

/**
 * @brief 注册Modbus寄存器
 * @param reg 寄存器配置
 * @return 成功返回0，失败返回-1
 */
int m_modbus_register(modbus_register_t *reg);

/**
 * @brief 启动Modbus服务（阻塞式，处理请求）
 * @return 成功返回0，失败返回-1
 */
int m_modbus_start(void);

/**
 * @brief 停止Modbus服务
 */
void m_modbus_stop(void);

/**
 * @brief 释放Modbus即插即用框架资源
 */
void m_modbus_deinit(void);

/**
 * @brief 读取寄存器值（应用层调用）
 * @param type 寄存器类型
 * @param addr 寄存器地址
 * @param val 输出值（线圈/离散输入为0/1，寄存器为16位值）
 * @return 成功返回0，失败返回-1
 */
int m_modbus_read_reg(modbus_reg_type_t type, uint16_t addr, uint16_t *val);

/**
 * @brief 写入寄存器值（应用层调用）
 * @param type 寄存器类型
 * @param addr 寄存器地址
 * @param val 要写入的值
 * @return 成功返回0，失败返回-1
 */
int m_modbus_write_reg(modbus_reg_type_t type, uint16_t addr, uint16_t val);

// -------------------------- 自动检测接口 --------------------------
/**
 * @brief 初始化自动检测配置（从配置文件加载参数）
 * @return 成功返回0，失败返回-1
 */
int m_modbus_scan_init(void);

/**
 * @brief 手动触发一次设备扫描（阻塞式）
 * @return 成功返回在线设备数量，失败返回-1
 */
int m_modbus_scan_once(void);

/**
 * @brief 启动定时自动扫描（后台线程）
 * @return 成功返回0，失败返回-1
 */
int m_modbus_scan_start(void);

/**
 * @brief 停止定时自动扫描
 */
void m_modbus_scan_stop(void);

/**
 * @brief 获取在线设备列表
 * @param dev_list 输出缓冲区（需提前分配内存）
 * @param max_len 缓冲区最大长度
 * @return 成功返回在线设备数量，失败返回-1
 */
int m_modbus_get_online_devs(modbus_online_dev_t *dev_list, int max_len);

/**
 * @brief 检查指定设备是否在线
 * @param mode 设备模式
 * @param dev_id 设备标识（RTU=从站地址，TCP=IP字符串）
 * @return 在线返回1，离线返回0，失败返回-1
 */
int m_modbus_is_dev_online(modbus_mode_t mode, const void *dev_id);

#endif // __m_modbus_H__